自定义json Marshalling
在开发中,若是遇到结构体中的私有变量(小写变量),需要出现在json Marshal
结果中,使用json外包显然是无法做到的,因为外包是无法看到私有变量的,reflect
机制需要的是大写变量,但就是需要这样的操作,怎么办呢,可以实现该结构体自有Marshal
方法。
看到一篇好文章:Custom JSON Marshalling in Go,以下是翻译。
补:
有人问我,这个小写变量没啥软用啊,你咋不大写?
额,我这里自己对结构体编写了构造函数,我有一些初始设置是写在结构体里的,不想被外界修改,所以使用了这个操作,另外我可以借助这个操作来更改实际输出给外部的结构体格式。
当然,一切以项目需求为主,。
Go的encoding/json
包使得序列化结构体s
到JSON数据变得非常容易。
1 | package main |
Output:
1 | {"id":1,"name":"Ken","lastSeen":"2009-11-10T23:00:00Z"} |
但是,如果我们想要改变其中一个字段值的显示方式呢?例如,假设我想LastSeen
成为一个unix时间戳。
简单的解决方案是引入另一个辅助struct
,并使用方法中正确格式化的值填充它MarshalJSON
。
1 | func (u *MyUser) MarshalJSON() ([]byte, error) { |
这是有用的,但是当有很多字段时它会变得很麻烦。如果我们可以将原始内容嵌入struct
到辅助中struct
并使其继承所有不需要更改的字段,这将是好的解决方式。
1 | func (u *MyUser) MarshalJSON() ([]byte, error) { |
这里的问题是辅助结构也将继承原始的MarshalJSON
方法,导致它进入无限循环(我:这里我不太清楚作者无限循环的意思
)。解决方案是为原始类型添加别名。此别名将具有所有相同的字段,但不包含任何方法。
1 | func (u *MyUser) MarshalJSON() ([]byte, error) { |
我:辅助
struct
的lastSeen
会覆盖原始struct
中的同名tag
参数。
可以使用相同的技术来实现UnmarshalJSON
方法。
1 | func (u *MyUser) UnmarshalJSON(data []byte) error { |
本文标题:自定义json Marshalling
文章作者:小师
发布时间:2019-02-17
最后更新:2023-04-01
原始链接:chunlife.top/2019/02/17/自定义json Marshalling/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可